/**
 ******************************************************************************
* @file    USART1_Config.h
* @brief   USART1串口通信模块头文件
* @author  嵌入式系统设计（18408107475@163.com）
* @version V1.2
* @date    2025-04-19
* @note    功能特性：
*          1. 支持全双工8N1格式串口通信
*          2. 提供轮询和中断两种工作模式
*          3. 内置数据包协议及错误检测
*          4. 硬件抽象层设计
*          
*          版本变更：
*          V1.2 - 新增数据包通信接口
*          V1.1 - 初始版本基础功能
******************************************************************************
*/

#ifndef __USART1_CONFIG_H
#define __USART1_CONFIG_H

#ifdef __cplusplus
extern "C" {
#endif

/*-------------------------------- 头文件依赖 --------------------------------*/
#include "stm32f10x.h"      // 单片机外设定时
#include "Delay.h"          // 延时函数
#include <stdio.h>          // 标准输入输出（支持printf）
#include <stdarg.h>         // 可变参数支持
#include <stdint.h>         // 标准整型定义

/*--------------------------- 宏定义 ----------------------------*/
#define PKG_HEADER     0xFF // 数据包头标识
#define PKG_FOOTER     0xFE // 数据包尾标识
#define PKG_DATA_LEN   4    // 数据包有效长度（字节）

/*--------------------------- 全局变量声明 ----------------------------*/
extern uint8_t USART1_TxPacket[PKG_DATA_LEN]; // 发送数据缓冲区
extern uint8_t USART1_RxPacket[PKG_DATA_LEN]; // 接收数据缓冲区

/**
* @brief  数据包接收标志（volatile修饰）
* @note   由中断服务程序修改，主程序读取
* @warning 必须使用volatile防止编译器优化
*/
extern volatile u8 USART1_RxFlag;

/*--------------------------- 函数声明 ----------------------------*/
/**
* @brief  USART1初始化配置
* @param  baud 波特率（单位bps，范围2400-115200）
* @note   默认引脚配置：
*         PA9(TX) - 复用推挽输出
*         PA10(RX) - 浮空输入
*/
void USART1_Config(uint32_t baud);

/**
* @brief  串口1中断服务函数
* @note   需在启动文件中配置中断向量
*/
void USART1_IRQHandler(void);

/**
* @brief  阻塞式单字节发送
* @param  Byte 待发送数据（0x00-0xFF）
*/
void USART1_SendByte(uint8_t Byte);

/**
* @brief  数据包发送函数
* @note   协议格式：[0xFF][DATAx4][0xFE]
*/
void USART1_SendPacket(void);

/**
* @brief  获取接收完成标志
* @retval 1-收到完整数据包 0-无数据
* @note   调用后自动清除标志位
*/
uint8_t USART1_GetRxFlag(void);

/**
* @brief  字节数组发送
* @param  Array  数据指针（const安全修饰）
* @param  Length 数据长度（字节）
* @warning 超过缓冲区长度将导致阻塞
*/
void USART1_SendArray(const uint8_t *Array, uint16_t Length);

/**
* @brief  通用串口字符串发送
* @param  USARTx 串口外设指针
* @param  str    字符串指针（自动检测'\0'）
*/
void USART_SendString(USART_TypeDef* USARTx, const char *str);

/**
* @brief  定长数字发送（自动补零）
* @param  Num    待发送数字（0-99999999）
* @param  Length 显示位数（1-8）
* @example USART1_SendNumber(123,5) 输出"00123"
*/
void USART1_SendNumber(uint32_t Num, uint8_t Length);

/**
* @brief  安全版格式化输出
* @param  format 格式化字符串（支持%s/%d/%f等）
* @note   内部缓冲区128字节，超长内容截断
*/
void USART1_Printf(const char *format, ...);

#ifdef __cplusplus
}
#endif

#endif /* __USART1_CONFIG_H */
